In the field of cloud computing, users essentially rent computing capacity from large cloud-computing providers instead of owning and operating their own servers. This allows them to only have as much capacity as is needed at any given point and to scale the capacity as demand shrinks or grows. In some cases, this capacity is used for long-running servers that handle requests from customers. In other cases, it is used for discrete tasks that process some amount of input data, produce some amount of output data, and then terminate. In the former case, a sudden surge in demand may result in the current set of servers becoming overloaded, leading to a need to quickly spin up additional servers to handle the increase in demand. In the latter case, the capacity may only be needed while the task is running.
Each of these scenarios presents its own challenges in selecting the appropriate place (be it cloud computing provider, data center, or specific server) to add additional capacity when it is needed. For example, if additional web server capacity is needed, then the server may need to run not only a web server, but also a database front-end and several plugins, each of which may need to be of a particular version to operate with the website code. Furthermore, each of these packages may only run on particular types of hardware, or may have different versions for different types of hardware. Thus, there is a need for a system that can automatically resolve dependencies between packages, retrieve the appropriate software packages, and launch them on an appropriate platform.
Data processing tasks have a different set of challenges: these tasks may perform computationally intensive processing on large amounts of data. This means that such tasks are typically scheduled on high-performance hardware. However, increasing the hardware requirements for a task reduces the set of candidate platforms on which that task can run. Accordingly, the platform selected may be much further (in a network bandwidth sense) from the source of the data on which it will operate, which means that running a task on higher performance hardware can actually take longer due to increased data transfer times. Thus, there is a need for a task allocation algorithm that can take into account not only the time needed to execute a task on a potential platform but also the need to transfer the data to and from that platform.